package main

import (
	"fmt"
	"runtime"
)

func f(from string) {
	for i := 0; i < 100; i++ {
		//3.runtime.Gosched()用于让出CPU时间片,这就像接力赛，A跑了一会碰到代码runtime.Gosched()就把接力棒交给B,B继续跑
		runtime.Gosched()
		fmt.Println("goroutines: ", from, "====", i)
		if i == 60 {
			fmt.Println("---- finished ----!")
			//4.当前的goroutine的运行终止，其它goroutine不会受影响，在终止当前goroutine前会先处理未执行的defer语句
			runtime.Goexit()
		}
	}
}

func foo(s string) {
	fmt.Println("main go :", s)
}

//go并发与并行
func main() {
	//1.并发是交替占用单个CPU时间片，并行是多条线同时占用cpu运行
	//2.主协程退出了，子协程也要跟着退出
	fmt.Println("cpus:", runtime.NumCPU())
	fmt.Println("goroot:", runtime.GOROOT())
	fmt.Println("archive:", runtime.GOOS)

	runtime.GOMAXPROCS(2)

	foo("direct")
	go f("go-1")
	go f("go-2")
	go func(s string) {
		fmt.Println(s)
	}("#######################")
	fmt.Scanln() //阻塞，按两下回车后继续
	fmt.Println("done")
}
